import Vue from 'vue'
// import {Message} from 'element-ui'
import { MMessage } from '@/utils/resetMessage';

// 错误提示
Vue.prototype.$messageError = (message) => {
  MMessage({
    showClose: true,
    message: message,
    center: true,
    type: 'error'
  })
}
// // 正确提示
Vue.prototype.$messageSuccess = (message) => {
  MMessage({
    showClose: true,
    message: message,
    center: true,
    type: 'success'
  })
}
// // 警告提示
Vue.prototype.$messageWarning = (message) => {
  MMessage({
    showClose: true,
    message: message,
    center: true,
    type: 'warning'
  })
}

// 对Date的扩展，将 Date 转化为指定格式的String
// 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
// 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
// 例子：
// new Date().Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
// new Date().Format("yyyy-M-d h:m:s.S")      ==> 2006-7-2 8:9:4.18
Date.prototype.Format = function (fmt) {
  var o = {
    "M+": this.getMonth() + 1, //月份
    "d+": this.getDate(), //日
    "H+": this.getHours(), //小时
    "m+": this.getMinutes(), //分
    "s+": this.getSeconds(), //秒
    "q+": Math.floor((this.getMonth() + 3) / 3), //季度
    "S": this.getMilliseconds() //毫秒
  };
  if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  for (var k in o)
    if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  return fmt;
}
// var time1 = new Date().Format("yyyy-MM-dd");
// var time2 = new Date().Format("yyyy-MM-dd HH:mm:ss");
// var time1 = new Date().Format("yyyy-MM-dd");
// var time2 = new Date().Format("yyyy-MM-dd HH:mm:ss");
// loading框设置局部刷新，且所有请求完成后关闭loading框
let loading
let needLoadingRequestCount = 0 // 声明一个对象用于存储请求个数
function startLoading(targetdq) {
  loading = Vue.prototype.$loading({
    lock: true,
    text: '努力加载中...',
    background: 'rgba(255,255,255,.4)',
    target: document.querySelector(targetdq) // 设置加载动画区域
  })
}

function endLoading() {
  loading.close()
}
export function showFullScreenLoading(targetdq) {
  if (needLoadingRequestCount === 0) {
    startLoading(targetdq)
  }
  needLoadingRequestCount++
}
export function hideFullScreenLoading() {
  if (needLoadingRequestCount <= 0) return
  needLoadingRequestCount--
  if (needLoadingRequestCount === 0) {
    endLoading()
  }
}

/*function getDeepSon(data,childType,callback){
  for(let i= 0; i<data.length; i++){
    if(data[i].hasOwnProperty(childType)&&data[i][childType].length>0){
      getDeepSon(data[i][childType],childType,callback)
    }else {
      callback && callback(data[i])
    }
  }
}*/
function getDeepSon(data, childType) {
  for (let i = 0; i < data.length; i++) {
    if (!!data[i].hasOwnProperty(childType) && data[i][childType].length > 0) {
      return getDeepSon(data[i][childType], childType)
    } else {
      return data[i]
    }
  }
}
export default {
  getDeepSon,
  showFullScreenLoading,
  hideFullScreenLoading,
  // 对于列表的actions统一处理
  resetListActions(list, approve) {
    list.forEach(item => {
      let history = '' // 历史记录放最后面
      for (let key in item.actions) {
        // 同意
        if (key === 'agree') {
          item.actions[key].name = '审批'
        }
        // 驳回
        if (key === 'reject') {
          delete item.actions[key]
        }
        // 撤回上报
        if (key === 'revokeReport') {
          delete item.actions[key]
        }
        // 重新上报
        if (key === 'report') {
          // item.actions[key].name = '上报'
          delete item.actions[key]
        }
        // 历史记录
        if (key === 'getHistory') {
          item.actions[key].name = '历史记录'
          history = item.actions[key]
        }
        // 作废 有审批时没有作废
        if (key === 'cancel') {
          delete item.actions[key]
        }
      }
      if (history !== '') {
        delete item.actions.getHistory
        item.actions.getHistory = history
      }
    })
  },
  // 对于列表的actions统一处理
  resetListActions2(list, approve) {
    list.forEach(item => {
      let history = '' // 历史记录放最后面
      for (let key in item.actions) {
        // 同意
        if (key === 'agree') {
          item.actions[key].name = '审批'
        }
        // 驳回
        if (key === 'reject') {
          //item.actions[key].name = '驳回'
          delete item.actions[key]
        }
        // 撤回上报
        if (key === 'revokeReport') {
          delete item.actions[key]
        }
        // 重新上报
        if (key === 'report') {
          item.actions[key].name = '上报'
          //delete item.actions[key]
        }
        // 历史记录
        if (key === 'getHistory') {
          item.actions[key].name = '历史记录'
          history = item.actions[key]
        }
        // 作废 有审批时没有作废
        if (key === 'cancel') {
          delete item.actions[key]
        }
      }
      if (history !== '') {
        delete item.actions.getHistory
        item.actions.getHistory = history
      }
    })
  },
  // 在对象数组中根据键值对找到该对象元素中的其他键值对
  getObjectArrayKeyValue(array, postKey, postValue, getKey) {
    let getValue = ''
    for (let index in array) {
      let item = array[index]
      if (item[postKey] === postValue) {
        getValue = item[getKey]
        break
      }
    }
    return getValue
  },
  // 获取日期
  getDateString(date) {
    date = date ? new Date(date) : new Date()

    let year = date.getFullYear() // 年 ,从 Date 对象以四位数字返回年份
    let month = date.getMonth() + 1 // 月 ,从 Date 对象返回月份 (0 ~ 11) ,date.getMonth()比实际月份少 1 个月
    let day = date.getDate() // 日 ,从 Date 对象返回一个月中的某一天 (1 ~ 31)

    let hours = date.getHours() // 小时 ,返回 Date 对象的小时 (0 ~ 23)
    let minutes = date.getMinutes() // 分钟 ,返回 Date 对象的分钟 (0 ~ 59)
    let seconds = date.getSeconds() // 秒 ,返回 Date 对象的秒数 (0 ~ 59)

    // 修改月份格式
    if (month >= 1 && month <= 9) {
      month = '0' + month
    }

    // 修改日期格式
    if (day >= 0 && day <= 9) {
      day = '0' + day
    }

    // 修改小时格式
    if (hours >= 0 && hours <= 9) {
      hours = '0' + hours
    }

    // 修改分钟格式
    if (minutes >= 0 && minutes <= 9) {
      minutes = '0' + minutes
    }

    // 修改秒格式
    if (seconds >= 0 && seconds <= 9) {
      seconds = '0' + seconds
    }

    // 获取当前系统时间  格式(yyyy-mm-dd hh:mm:ss)
    let currentFormatDate = year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
    return currentFormatDate
  },

  getYearMonth(date) {
    date = date ? new Date(date) : new Date()

    let year = date.getFullYear() // 年 ,从 Date 对象以四位数字返回年份
    let month = date.getMonth() + 1 // 月 ,从 Date 对象返回月份 (0 ~ 11) ,date.getMonth()比实际月份少 1 个月

    // 修改月份格式
    if (month >= 1 && month <= 9) {
      month = '0' + month
    }

    // 获取当前系统时间  格式(yyyy-mm-dd hh:mm:ss)
    let currentFormatDate = year + '-' + month
    return currentFormatDate
  },
  //转换数值整数部分为会计计数法（3位一逗号）
  exchangeKuaiJi(before) {
    if (before == undefined) return ''
    let numFlag = true
    //判断是否正数，是负数就先删掉 - 然后最后加回去
    if (before >= 0) {
      numFlag = true
    } else {
      numFlag = false
    }
    before = before.toString()
    let num = before.split('.')[0]
    if (numFlag !== true) {
      num = parseFloat(num.toString().substr(1, num.toString().length))
    }
    let numSmall = before.split('.')[1]
    let result = [], counter = 0;
    num = (num || 0).toString().split('');
    for (let i = num.length - 1; i >= 0; i--) {
      counter++;
      result.unshift(num[i]);
      if (!(counter % 3) && i != 0) {
        result.unshift(',');
      }
    }
    if (numSmall !== undefined && numSmall.toString().length === 1) {
      //小数位小于2位则补0
      numSmall = numSmall + '0'
    }
    let after = numSmall === undefined ? result.join('') + '.00' : result.join('') + '.' + numSmall
    if (after == "0.00") {
      numFlag = true
    }
    if (numFlag !== true) {
      after = '-' + after
    }
    return after
  },


  /**
   ** 加法函数，用来得到精确的加法结果
   ** 说明：javascript的加法结果会有误差，在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。
   ** 调用：accAdd(arg1,arg2)
   ** 返回值：arg1加上arg2的精确结果
   **/
  accAdd(arg1, arg2) {
    var r1, r2, m, c;
    try {
      r1 = arg1.toString().split(".")[1].length;
    } catch (e) {
      r1 = 0;
    }
    try {
      r2 = arg2.toString().split(".")[1].length;
    } catch (e) {
      r2 = 0;
    }
    c = Math.abs(r1 - r2);
    m = Math.pow(10, Math.max(r1, r2));
    if (c > 0) {
      var cm = Math.pow(10, c);
      if (r1 > r2) {
        arg1 = Number(arg1.toString().replace(".", ""));
        arg2 = Number(arg2.toString().replace(".", "")) * cm;
      } else {
        arg1 = Number(arg1.toString().replace(".", "")) * cm;
        arg2 = Number(arg2.toString().replace(".", ""));
      }
    } else {
      arg1 = Number(arg1.toString().replace(".", ""));
      arg2 = Number(arg2.toString().replace(".", ""));
    }
    return (arg1 + arg2) / m;
  },
  /**
   ** 减法函数，用来得到精确的减法结果
   ** 说明：javascript的减法结果会有误差，在两个浮点数相减的时候会比较明显。这个函数返回较为精确的减法结果。
   ** 调用：accSub(arg1,arg2)
   ** 返回值：arg1加上arg2的精确结果
   **/
  accSub(arg1, arg2) {
    var r1, r2, m, n;
    try {
      r1 = arg1.toString().split(".")[1].length;
    } catch (e) {
      r1 = 0;
    }
    try {
      r2 = arg2.toString().split(".")[1].length;
    } catch (e) {
      r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
    n = (r1 >= r2) ? r1 : r2;
    return ((arg1 * m - arg2 * m) / m).toFixed(n);
  },

  /**
   ** 乘法函数，用来得到精确的乘法结果
   ** 说明：javascript的乘法结果会有误差，在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。
   ** 调用：accMul(arg1,arg2)
   ** 返回值：arg1乘以 arg2的精确结果
   **/
  accMul(arg1, arg2) {
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    try {
      m += s1.split(".")[1].length;
    } catch (e) {
    }
    try {
      m += s2.split(".")[1].length;
    } catch (e) {
    }
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
  },
  /**
   ** 除法函数，用来得到精确的除法结果
   ** 说明：javascript的除法结果会有误差，在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。
   ** 调用：accDiv(arg1,arg2,digit)  除数，被除数， 保留的小数点后的位数
   ** 返回值：arg1除以arg2的精确结果
   **/
  accDiv(arg1, arg2, digit) {
    var t1 = 0, t2 = 0, r1, r2;
    try {
      t1 = arg1.toString().split(".")[1].length
    } catch (e) {
    }
    try {
      t2 = arg2.toString().split(".")[1].length
    } catch (e) {
    }
    r1 = Number(arg1.toString().replace(".", ""))
    r2 = Number(arg2.toString().replace(".", ""))
    //获取小数点后的计算值
    var result = ((r1 / r2) * Math.pow(10, t2 - t1)).toString()
    var result2 = result.split(".")[1];
    result2 = result2.substring(0, digit > result2.length ? result2.length : digit);

    return Number(result.split(".")[0] + "." + result2);
  },
  /**
   * 显示文件图标
   * @param value 文件名
   * @returns {string}
   * @param path    当前相对路径   ../../
   */
  filesTypeFilter(value, path) {
    let iconSrc = ''
    let type = ''
    if (value.split('.').length > 1) {
      type = value.split('.')[value.split('.').length - 1].toLowerCase()
      switch (type) {
        case 'doc':
          iconSrc = require(`@/assets/images/fileTableImg/doc.svg`)
          break
        case 'docx':
          iconSrc = require(`@/assets/images/fileTableImg/doc.svg`)
          break
        case 'pdf':
          iconSrc = require(`@/assets/images/fileTableImg/pdf.svg`)
          break
        case 'ppt':
          iconSrc = require(`@/assets/images/fileTableImg/ppt.svg`)
          break
        case 'xls':
          iconSrc = require(`@/assets/images/fileTableImg/xls.svg`)
          break
        case 'xlsx':
          iconSrc = require(`@/assets/images/fileTableImg/xls.svg`)
          break
        case 'jpg':
          iconSrc = require(`@/assets/images/fileTableImg/img.svg`)
          break
        case 'jpeg':
          iconSrc = require(`@/assets/images/fileTableImg/img.svg`)
          break
        case 'mp4':
          iconSrc = require(`@/assets/images/fileTableImg/mp4.svg`)
          break
        case 'png':
          iconSrc = require(`@/assets/images/fileTableImg/img.svg`)
          break
        case 'zip':
          iconSrc = require(`@/assets/images/fileTableImg/zip.svg`)
          break
        case 'rar':
          iconSrc = require(`@/assets/images/fileTableImg/rar.svg`)
          break
        case 'dwg':
          iconSrc = require(`@/assets/images/fileTableImg/CAD.svg`)
          break
        case 'cad':
          iconSrc = require(`@/assets/images/fileTableImg/CAD.svg`)
          break
        case undefined:
          iconSrc = require(`@/assets/images/fileTableImg/file.svg`)
          break
        default:
          iconSrc = require(`@/assets/images/fileTableImg/common.svg`)
          break
      }
      return iconSrc
    } else {
      return require(`@/assets/images/fileTableImg/file.svg`)
    }
  },

  /**
   * 获取文件格式
   * @param name
   */
  getType(value) {
    return value.split('.')[value.split('.').length - 1].toLowerCase()
  },
  /**
   * base64转图片文件
   * @param dataurl
   * @param filename
   * @returns {File}
   */
  dataURLtoFile(dataurl, filename = 'file') {
    let arr = dataurl.split(',')
    let mime = arr[0].match(/:(.*?);/)[1]
    let suffix = mime.split('/')[1]
    let bstr = atob(arr[1])
    let n = bstr.length
    let u8arr = new Uint8Array(n)
    while (n--) {
      u8arr[n] = bstr.charCodeAt(n)
    }
    return new File([u8arr], `${filename}.${suffix}`, {
      type: mime
    })
  },

  /**
   * 生成新的路由
   * @param route  路由表
   * @param storage 后台返回的路由表
   */
  createRoute(route, storage) {
    // console.log(route, storage, 'sssssssssssssssss')
    let newRoute = [...route]
    storage.forEach(item => {
      newRoute[3].children.forEach(child => {
        // console.log(item.url, '后端返回的值')
        // console.log(child.path, '路由表里面的path')
        if (item.url === child.path) {
          // console.log(item, '================= first')
          // console.log(child, '>>>>>>>>>>>>>>>>>two')
          if (child.hasOwnProperty('children')) {
            child.children.forEach(val => {
              val.meta.active[0] = item.num
            })
          } else {
            child.meta.active[0] = item.num
          }
        }
      })
    })
    return newRoute
  },
  /**
    * 函数防抖 (只执行最后一次点击)
    * @param fn
    * @param delay
    * @returns {Function}
    * @constructor
    */

  Debounce(fn, t) {
    let delay = t || 500;
    let timer;
    // console.log(fn)
    // console.log(typeof fn)
    return function () {
      let args = arguments;
      if (timer) {
        clearTimeout(timer);
      }
      timer = setTimeout(() => {
        timer = null;
        fn.apply(this, args);
      }, delay);
    }
  },
  /**
   * 路由扁平
   */
  routerFlat() {

  },
  changeInputLimit(e) {
    let key = e.key
    if (key == 'e') {
      e.returnValue = false
    }
    if (key == 'E') {
      e.returnValue = false
    }
    return true
  },
  UpNegativeNumber(e) {
    e.target.value = e.target.value.replace(/[^\-?\d.]/g, '')
  },

  nowSize(val, initWidth = 1920) {
    let nowClientWidth = document.documentElement.clientWidth;
    return val * (nowClientWidth / initWidth);
  },
  /**
   * 修改来源的指,匹配组件内的中文名
   */
  changeSources(sources) {
    let name = ''
    switch (sources) {
      case "产业类立项报审":
        name = "产业类项目决策/立项报审"
        break
      case "工程可行性研究报告":
        name = "工可阶段/工程可行性研究报告"
        break
      case "工程初步设计":
        name = "前期工程管理/初设阶段/工程初步设计"
        break
      case "勘察施工图-施工图审查":
        name = "前期工程管理/勘察施工图/施工图审查"
        break
      case "勘察施工图-方案审查":
        name = "前期工程管理/施工图阶段/勘察施工图-方案审查"
        break
      case "招标计划":
        name = "招标管理/招标计划"
        break
      case "公开招标":
        name = "招标管理/招标过程/公开招标"
        break
      case "直接委托":
        name = "招标管理/招标过程/直接委托"
        break
      case "变更方案论证":
        name = "变更管理/变更/方案论证"
        break
      case "变更签证":
        name = "变更管理/签证"
        break
      case "变更申请":
        name = "变更管理/变更/变更申请"
        break
      case "新增":
        name = "综合办公/会议管理/待开会事项"
        break
      default:
        name = ""
    }
    return name
  },
  /**
   * 级联选择器回显数据时传入子节点和树，返回级联选择器需要的从父节点开始的路径树
   */
  recoverCascader(tree, leaves, childrenPropName = "children", keyPropName = "id") {
    let res = []
    for (let leaf of leaves) {
      res.push(this.recoverCascaderSingleNode([], tree, leaf, childrenPropName, keyPropName))
    }
    // console.log("recoverCascader",res)
    return res;
  },
  recoverCascaderSingleNode(path, tree, leaf, childrenPropName = "children", keyPropName = "id") {
    // console.log("search for "+ leaf)
    try {
      let res = this.recoverCascaderSingleNodeResc(path, tree, leaf, childrenPropName, keyPropName)
      if (res[res.length - 1] == leaf) {
        return res;
      }
    } catch (e) {
      console.log("搜索树失败", e)
    }
    return null
  },
  recoverCascaderSingleNodeResc(path, tree, leaf, childrenPropName = "children", keyPropName = "id") {
    if (tree == null) {
      return null;
    }
    for (let node of tree) {
      let path2 = []
      for (let i of path) {
        path2.push(i)
      }
      path2.push(node[keyPropName])
      // console.log("search",path2)
      if (path2[path2.length - 1] == leaf) {
        // console.log("found")
        return path2;
      }
      let nextRes = this.recoverCascaderSingleNodeResc(path2, node[childrenPropName], leaf, childrenPropName)
      if (nextRes != null) {
        return nextRes;
      }
    }
  },
  getNewTreeData(treeData, type) {
    let bianpingArr = []
    let func = function (list) {
      let res = []
      res = list.concat(...list.map(item => {
        if (item[type] instanceof Array && item[type].length > 0) {
          return func(item[type])
        }
        return null
      }).filter(o => o instanceof Array && o.length > 0))
      return res
    }
    bianpingArr = func(treeData)
    return bianpingArr
  },
  showPreviewBtn(val, key = 'fileName') {
    if (val.hasOwnProperty(key)) {
      let fileType = val[key].split('.')[1]
      if (fileType.indexOf('xls') > -1) {
        return false
      } else {
        return true
      }
    }
  },
}
